﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OfficeOpenXml;
using Range = OfficeOpenXml.ExcelRange;

namespace 畜牧业审核程序国产.Models.PreReview
{
    internal class Poultry:Animal
    {
        public Poultry()
        {
            调查户编码所在行 = 4;
            调查户编码所在列 = 1;
            开始行 = 9;
            结束行 = 24;
            填报指标数量 = 16;
            村信息所在行 = 13;
            村信息所在列 = 2;
            时点数结束行 = 13;
            Name = "家禽";
            TableName = "212";
        }
        public override string MandatoryReview(ExcelWorksheet sht)
        {
            base.本月及上季末月指标空值转成0并所有单元格全部居中(sht);
            base.本季度及上季度指标空值转成0(sht);
            base.恢复单元格颜色并删除注释(sht);
            var 户编码 = GetFarmCode(sht, 2, 1);

            for (int i = 3; i > 0; i--)//从这个季度的最左边的单元格开始
            {

               
                int 正在审核的列 = 本季度数据所在列 - i;
                Range rng月末存栏 = sht.Cells[开始行, 正在审核的列];
                Range rng月末肉用家禽存栏 = sht.Cells[开始行 + 1, 正在审核的列]; ;
                Range rng月末肉鸡存栏 = sht.Cells[开始行 + 2, 正在审核的列];
                Range rng月末蛋用家禽存栏 = sht.Cells[开始行 + 3, 正在审核的列];
                Range rng月末蛋鸡存栏 = sht.Cells[开始行 + 4, 正在审核的列];
                Range rng当月减少家禽只数 = sht.Cells[开始行 + 5, 正在审核的列];
                Range rng当月自宰家禽只数 = sht.Cells[开始行 + 6, 正在审核的列];
                Range rng当月自宰活鸡只数 = sht.Cells[开始行 + 7, 正在审核的列];
                Range rng当月出售家禽只数 = sht.Cells[开始行 + 8, 正在审核的列];
                Range rng当月出售活鸡只数 = sht.Cells[开始行 + 9, 正在审核的列];
                Range rng当月出售家禽金额 = sht.Cells[开始行 + 10, 正在审核的列];
                Range rng当月出售活鸡金额 = sht.Cells[开始行 + 11, 正在审核的列];
                Range rng当月出售家禽重量 = sht.Cells[开始行 + 12, 正在审核的列];
                Range rng当月出售活鸡重量 = sht.Cells[开始行 + 13, 正在审核的列];
                Range rng当月禽蛋产量 = sht.Cells[开始行 + 14, 正在审核的列];
                Range rng当月鸡蛋产量 = sht.Cells[开始行 + 15, 正在审核的列];


                #region 2.表内指标 ①　　期末存栏≠肉用家禽+蛋用家禽


                if (Convert.ToDouble (rng月末存栏.Value) != Convert.ToDouble(rng月末肉用家禽存栏.Value) + Convert.ToDouble(rng月末蛋用家禽存栏.Value))
                {
                    string 提示信息 = "期末存栏应该等于肉用家禽与绵蛋用家禽之和";

                    Range[] ranges = new Range[] { rng月末存栏, rng月末肉用家禽存栏, rng月末蛋用家禽存栏 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                   
                }
                #endregion
                #region ② 　肉用家禽<肉鸡数量

                if (Convert.ToDouble(rng月末肉用家禽存栏.Value) < Convert.ToDouble(rng月末肉鸡存栏.Value))
                {
                    string 提示信息 = "期末存栏肉用家禽数量应大于等于肉鸡数量";
                    Range[] rngs = new Range[] { rng月末肉用家禽存栏, rng月末肉鸡存栏 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, rngs);
                    
                }
                #endregion
                #region ③　蛋用家禽<蛋鸡数量

                if (Convert.ToDouble(rng月末蛋用家禽存栏.Value) < Convert.ToDouble(rng月末蛋鸡存栏.Value))
                {
                    string 提示信息 = "期末存栏蛋用家禽数量应大于等于蛋鸡数量";
                    Range[] rngs = new Range[] { rng月末蛋用家禽存栏, rng月末蛋鸡存栏 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, rngs);
                   
                }


                #endregion
                #region ④期内减少头数<自宰家禽数量+出售家禽数量

                if (Convert.ToDouble(rng当月减少家禽只数.Value) < Convert.ToDouble(rng当月自宰家禽只数.Value) + Convert.ToDouble(rng当月出售家禽只数.Value))
                {
                    string 提示信息 = "期内减少数量应大于等于自宰家禽数量、出售家禽数量之和";
                    Range[] ranges = new Range[] { rng当月减少家禽只数, rng当月自宰家禽只数, rng当月出售家禽只数 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                   
                }
                #endregion
                #region ⑤自宰家禽数量<自宰活鸡数量

                if (Convert.ToDouble(rng当月自宰家禽只数.Value) < Convert.ToDouble(rng当月自宰活鸡只数.Value))
                {
                    string 提示信息 = "自宰家禽数量应该大于等于活鸡数量";
                    Range[] ranges = new Range[] { rng当月自宰家禽只数, rng当月自宰活鸡只数 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                    
                }

                #endregion
                #region ⑥出售家禽数量<出售活鸡数量

                if (Convert.ToDouble(rng当月出售家禽只数.Value) < Convert.ToDouble(rng当月出售活鸡只数.Value))
                {
                    string 提示信息 = "出售家禽数量应大于等于出售活鸡数量";
                    Range[] ranges = new Range[] { rng当月出售家禽只数, rng当月出售活鸡只数 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                    
                }
                #endregion
                #region ⑦出售家禽金额<出售活鸡金额


                if (Convert.ToDouble(rng当月出售家禽金额.Value) < Convert.ToDouble(rng当月出售活鸡金额.Value))
                {

                    string 提示信息 = "出售家禽金额应大于等于出售活鸡金额";
                    Range[] ranges = new Range[] { rng当月出售家禽金额, rng当月出售活鸡金额 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                   
                }
                #endregion
                #region ⑧出售家禽重量<出售活鸡重量
                if (Convert.ToDouble(rng当月出售家禽重量.Value)< Convert.ToDouble(rng当月出售活鸡重量.Value))
                {

                    string 提示信息 = "出售家禽重量应大于等于出售活鸡重量";
                    Range[] ranges = new Range[] { rng当月出售家禽重量, rng当月出售活鸡重量 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                    
                }
                #endregion
                #region ⑨禽产蛋数量<鸡蛋数量

                if (Convert.ToDouble(rng当月禽蛋产量.Value) < Convert.ToDouble(rng当月鸡蛋产量.Value))
                {
                    string 提示信息 = "禽蛋数量应大于等于鸡蛋数量";
                    Range[] ranges = new Range[] { rng当月禽蛋产量, rng当月鸡蛋产量 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                    
                }
                #endregion

                #region ⑩　若出售家禽数量=0，出售活鸡数量≠0，出售家禽金额≠0，出售活鸡金额≠0，出售家禽重量≠0，出售活鸡重量≠0
                if (Convert.ToDouble(rng当月出售家禽只数.Value) == 0 &&
                                     (Convert.ToDouble(rng当月出售活鸡只数.Value) != 0 || Convert.ToDouble(rng当月出售家禽重量.Value) != 0 || Convert.ToDouble(rng当月出售家禽金额.Value) != 0 || Convert.ToDouble(rng当月出售活鸡重量.Value) != 0 || Convert.ToDouble(rng当月出售活鸡金额.Value) != 0))
                {
                    string 提示信息 = "若出售家禽数量为0，那么出售活鸡数量、出售家禽金额、活鸡金额、出售家禽重量、活鸡重量均应为0";
                    Range[] ranges = new Range[] { rng当月出售家禽只数, rng当月出售活鸡只数, rng当月出售家禽重量, rng当月出售活鸡重量, rng当月出售家禽金额, rng当月出售活鸡金额 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                    
                }
                #endregion
                #region 11　若有出售活鸡,则只数、金额、重量至少有一个未填
                if (Convert.ToDouble(rng当月出售活鸡只数.Value) + Convert.ToDouble(rng当月出售活鸡重量.Value) + Convert.ToDouble(rng当月出售活鸡金额.Value) > 0 &&
                    Convert.ToDouble(rng当月出售活鸡只数.Value) * Convert.ToDouble(rng当月出售活鸡重量.Value) * Convert.ToDouble(rng当月出售活鸡金额.Value) == 0)
                {
                    string 提示信息 = "若有出售活鸡,则只数、金额、重量至少有一个未填";
                    Range[] ranges = new Range[] { rng当月出售活鸡只数, rng当月出售活鸡重量, rng当月出售活鸡金额 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                    
                }
                #endregion
                #region 12如果有出售家禽,则头数\价格\产量至少有一个未填
                if (Convert.ToDouble(rng当月出售家禽只数.Value) > 0 &&
                    Convert.ToDouble(rng当月出售家禽只数.Value) * Convert.ToDouble(rng当月出售家禽重量.Value) * Convert.ToDouble(rng当月出售家禽金额.Value) == 0)
                {
                    string 提示信息 = "有家禽出售,出售家禽金额、重量至少有一个未填";
                    Range[] ranges = new Range[] { rng当月出售家禽只数, rng当月出售家禽重量, rng当月出售家禽金额 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                    
                }
                #endregion
            }
            //季度
            Range rng季末存栏 = sht.Cells[开始行, 本季度数据所在列];
            Range rng季末肉用家禽存栏 = sht.Cells[开始行 + 1, 本季度数据所在列]; ;
            Range rng季末肉鸡存栏 = sht.Cells[开始行 + 2, 本季度数据所在列];
            Range rng季末蛋用家禽存栏 = sht.Cells[开始行 + 3, 本季度数据所在列];
            Range rng季末蛋鸡存栏 = sht.Cells[开始行 + 4, 本季度数据所在列];
            Range rng当季减少家禽只数 = sht.Cells[开始行 + 5, 本季度数据所在列];
            Range rng当季自宰家禽只数 = sht.Cells[开始行 + 6, 本季度数据所在列];
            Range rng当季自宰活鸡只数 = sht.Cells[开始行 + 7, 本季度数据所在列];
            Range rng当季出售家禽只数 = sht.Cells[开始行 + 8, 本季度数据所在列];
            Range rng当季出售活鸡只数 = sht.Cells[开始行 + 9, 本季度数据所在列];
            Range rng当季出售家禽金额 = sht.Cells[开始行 + 10, 本季度数据所在列];
            Range rng当季出售活鸡金额 = sht.Cells[开始行 + 11, 本季度数据所在列];
            Range rng当季出售家禽重量 = sht.Cells[开始行 + 12, 本季度数据所在列];
            Range rng当季出售活鸡重量 = sht.Cells[开始行 + 13, 本季度数据所在列];
            Range rng当季禽蛋产量 = sht.Cells[开始行 + 14, 本季度数据所在列];
            Range rng当季鸡蛋产量 = sht.Cells[开始行 + 15, 本季度数据所在列];

            #region 2.表内指标 ①　　期末存栏≠肉用家禽+蛋用家禽


            if (Convert.ToDouble( rng季末存栏.Value) != Convert.ToDouble(rng季末肉用家禽存栏.Value) + Convert.ToDouble(rng季末蛋用家禽存栏.Value))
            {
                string 提示信息 = "期末存栏应该等于肉用家禽与绵蛋用家禽之和";

                Range[] ranges = new Range[] { rng季末存栏, rng季末肉用家禽存栏, rng季末蛋用家禽存栏 };
                base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                
            }
            #endregion
            #region ② 　肉用家禽<肉鸡数量

            if (Convert.ToDouble(rng季末肉用家禽存栏.Value) < Convert.ToDouble(rng季末肉鸡存栏.Value))
            {
                string 提示信息 = "期末存栏肉用家禽数量应大于等于肉鸡数量";
                Range[] rngs = new Range[] { rng季末肉用家禽存栏, rng季末肉鸡存栏 };
                base.错误单元格标注成红色并加注释(提示信息,sht, rngs);
                
            }
            #endregion
            #region ③　蛋用家禽<蛋鸡数量

            if (Convert.ToDouble(rng季末蛋用家禽存栏.Value) < Convert.ToDouble(rng季末蛋鸡存栏.Value))
            {
                string 提示信息 = "期末存栏蛋用家禽数量应大于等于蛋鸡数量";
                Range[] rngs = new Range[] { rng季末蛋用家禽存栏, rng季末蛋鸡存栏 };
                base.错误单元格标注成红色并加注释(提示信息,sht, rngs);
               
            }


            #endregion
            #region ④期内减少头数<自宰家禽数量+出售家禽数量

            if (Convert.ToDouble(rng当季减少家禽只数.Value) < Convert.ToDouble(rng当季自宰家禽只数.Value) + Convert.ToDouble(rng当季出售家禽只数.Value))
            {
                string 提示信息 = "期内减少数量应大于等于自宰家禽数量、出售家禽数量之和";
                Range[] ranges = new Range[] { rng当季减少家禽只数, rng当季自宰家禽只数, rng当季出售家禽只数 };
                base.错误单元格标注成红色并加注释(提示信息, sht, ranges);
                
            }
            #endregion
            #region ⑤自宰家禽数量<自宰活鸡数量

            if (Convert.ToDouble(rng当季自宰家禽只数.Value) < Convert.ToDouble(rng当季自宰活鸡只数.Value))
            {
                string 提示信息 = "自宰家禽数量应该大于等于活鸡数量";
                Range[] ranges = new Range[] { rng当季自宰家禽只数, rng当季自宰活鸡只数 };
                base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                
            }

            #endregion
            #region ⑥出售家禽数量<出售活鸡数量

            if (Convert.ToDouble(rng当季出售家禽只数.Value) < Convert.ToDouble(rng当季出售活鸡只数.Value))
            {
                string 提示信息 = "出售家禽数量应大于等于出售活鸡数量";
                Range[] ranges = new Range[] { rng当季出售家禽只数, rng当季出售活鸡只数 };
                base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                
            }
            #endregion
            #region ⑦出售家禽金额<出售活鸡金额


            if (Convert.ToDouble(rng当季出售家禽金额.Value) < Convert.ToDouble(rng当季出售活鸡金额.Value))
            {

                string 提示信息 = "出售家禽金额应大于等于出售活鸡金额";
                Range[] ranges = new Range[] { rng当季出售家禽金额, rng当季出售活鸡金额 };
                base.错误单元格标注成红色并加注释(提示信息, sht,ranges);
                
            }
            #endregion
            #region ⑧出售家禽重量<出售活鸡重量
            if (Convert.ToDouble(rng当季出售家禽重量.Value) < Convert.ToDouble(rng当季出售活鸡重量.Value))
            {

                string 提示信息 = "出售家禽重量应大于等于出售活鸡重量";
                Range[] ranges = new Range[] { rng当季出售家禽重量, rng当季出售活鸡重量 };
                base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                
            }
            #endregion
            #region ⑨禽产蛋数量<鸡蛋数量

            if (Convert.ToDouble(rng当季禽蛋产量.Value) < Convert.ToDouble(rng当季鸡蛋产量.Value))
            {
                string 提示信息 = "禽蛋数量应大于等于鸡蛋数量";
                Range[] ranges = new Range[] { rng当季禽蛋产量, rng当季鸡蛋产量 };
                base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                
            }
            #endregion

            #region ⑩　若出售家禽数量=0，出售活鸡数量≠0，出售家禽金额≠0，出售活鸡金额≠0，出售家禽重量≠0，出售活鸡重量≠0
            if (Convert.ToDouble(rng当季出售家禽只数.Value )== 0 && (Convert.ToDouble(rng当季出售活鸡只数.Value) != 0 || Convert.ToDouble(rng当季出售家禽重量.Value) != 0
                || Convert.ToDouble(rng当季出售家禽金额.Value) != 0 || Convert.ToDouble(rng当季出售活鸡重量.Value) != 0 || Convert.ToDouble(rng当季出售活鸡金额.Value) != 0))
            {
                string 提示信息 = "若出售家禽数量为0，那么出售活鸡数量、出售家禽金额、活鸡金额、出售家禽重量、活鸡重量均应为0";
                Range[] ranges = new Range[] { rng当季出售家禽只数, rng当季出售活鸡只数, rng当季出售家禽重量, rng当季出售活鸡重量, rng当季出售家禽金额, rng当季出售活鸡金额 };
                base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                
            }
            #endregion
            #region 11　若有出售活鸡,则只数、金额、重量至少有一个未填
            if (Convert.ToDouble(rng当季出售活鸡只数.Value) + Convert.ToDouble(rng当季出售活鸡重量.Value) + Convert.ToDouble(rng当季出售活鸡金额.Value)> 0 &&
                Convert.ToDouble(rng当季出售活鸡只数.Value) * Convert.ToDouble(rng当季出售活鸡重量.Value) * Convert.ToDouble(rng当季出售活鸡金额.Value) == 0)
            {
                string 提示信息 = "若有出售活鸡,则只数、金额、重量至少有一个未填";
                Range[] ranges = new Range[] { rng当季出售活鸡只数, rng当季出售活鸡重量, rng当季出售活鸡金额 };
                base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                
            }
            #endregion

            #region 12如果有出售家禽,则头数\价格\产量至少有一个未填
            if (Convert.ToDouble(rng当季出售家禽只数.Value) > 0 &&
                Convert.ToDouble(rng当季出售家禽只数.Value) * Convert.ToDouble(rng当季出售家禽重量.Value) * Convert.ToDouble(rng当季出售家禽金额.Value) == 0)
            {
                string 提示信息 = "有家禽出售,出售家禽金额、重量至少有一个未填";
                Range[] ranges = new Range[] { rng当季出售家禽只数, rng当季出售家禽重量, rng当季出售家禽金额 };
                base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                
            }
            #endregion

            return "强制性审核完成";
        }

        public override void VerificationReview(ExcelWorksheet sht)
        {
            核实性说明标题填写(sht);
            List<string> ListSTR_核实性错误内容 = new List<string>();
            //接下去先审核,并把错误写到一个集合中或字典中
            for (int i = 3; i > 0; i--)//从这个季度的最左边的单元格开始
            {
                int 正在审核的列 = this.本季度数据所在列 - i;
                Range rng月末存栏 = sht.Cells[开始行, 正在审核的列];
                Range rng月末肉用家禽存栏 = sht.Cells[开始行 + 1, 正在审核的列]; ;
                Range rng月末肉鸡存栏 = sht.Cells[开始行 + 2, 正在审核的列];
                Range rng月末蛋用家禽存栏 = sht.Cells[开始行 + 3, 正在审核的列];
                Range rng月末蛋鸡存栏 = sht.Cells[开始行 + 4, 正在审核的列];
                Range rng当月减少家禽只数 = sht.Cells[开始行 + 5, 正在审核的列];
                Range rng当月自宰家禽只数 = sht.Cells[开始行 + 6, 正在审核的列];
                Range rng当月自宰活鸡只数 = sht.Cells[开始行 + 7, 正在审核的列];
                Range rng当月出售家禽只数 = sht.Cells[开始行 + 8, 正在审核的列];
                Range rng当月出售活鸡只数 = sht.Cells[开始行 + 9, 正在审核的列];
                Range rng当月出售家禽金额 = sht.Cells[开始行 + 10, 正在审核的列];
                Range rng当月出售活鸡金额 = sht.Cells[开始行 + 11, 正在审核的列];
                Range rng当月出售家禽重量 = sht.Cells[开始行 + 12, 正在审核的列];
                Range rng当月出售活鸡重量 = sht.Cells[开始行 + 13, 正在审核的列];
                Range rng当月禽蛋产量 = sht.Cells[开始行 + 14, 正在审核的列];
                Range rng当月鸡蛋产量 = sht.Cells[开始行 + 15, 正在审核的列];



                #region  ①若出售家禽数量>0，出售家禽重量/出售家禽头数≤1.5

                if (Convert.ToDouble( rng当月出售家禽只数.Value) > 0 && Convert.ToDouble(rng当月出售家禽重量.Value) / Convert.ToDouble(rng当月出售家禽只数.Value) <= 1.5)
                {
                    string 平均头重 = ((double)rng当月出售家禽重量.Value / (double)rng当月出售家禽只数.Value).ToString("F2");
                    string 错误描述 = $"[月度错误]家禽出栏头重偏小,不足1.5公斤,小鸡小鸭若是卖掉别人继续养不算出售:";
                    string 具体错误 = $"{sht.Cells[开始行 - 2, 正在审核的列].Value.ToString()}出栏数为{rng当月出售家禽只数.Value.ToString()}头,重量为{rng当月出售家禽重量.Value.ToString()}公斤,平均头重为{Convert.ToString(Math.Round((double)rng当月出售家禽重量.Value / (double)rng当月出售家禽只数.Value, 2))}公斤";
                    ListSTR_核实性错误内容.Add(错误描述 + 具体错误);
                }

                #endregion
                #region  ②若出售家禽数量>0，出售家禽重量/出售家禽头数>4

                if (Convert.ToDouble(rng当月出售家禽只数.Value) > 0 && Convert.ToDouble(rng当月出售家禽重量.Value) / Convert.ToDouble(rng当月出售家禽只数.Value) > 4)
                {
                    string 平均头重 = (Convert.ToDouble(rng当月出售家禽重量.Value) / Convert.ToDouble(rng当月出售家禽只数.Value)).ToString("F2");
                    string 错误描述 = $"[月度错误]家禽出栏头重偏大,超过4公斤:";
                    string 具体错误 = $"{sht.Cells[开始行 - 2, 正在审核的列].Value.ToString()}出栏数为{rng当月出售家禽只数.Value.ToString()}头,重量为{rng当月出售家禽重量.Value.ToString()}公斤,平均头重为{平均头重}公斤";
                    ListSTR_核实性错误内容.Add(错误描述 + 具体错误);
                }

                #endregion
                #region  ③　若出售活鸡数量>0，出售活鸡重量/出售活鸡头数≤1.5

                if (Convert.ToDouble(rng当月出售活鸡只数.Value) > 0 && Convert.ToDouble(rng当月出售活鸡重量.Value) / Convert.ToDouble(rng当月出售活鸡只数.Value) <= 1.5)
                {
                    string 平均头重 = (Convert.ToDouble(rng当月出售活鸡重量.Value) / Convert.ToDouble(rng当月出售活鸡只数.Value)).ToString("F2");
                    string 错误描述 = $"[月度错误]活鸡出栏头重偏小,不足1.5公斤,小鸡若是卖掉别人继续养不算出售:";
                    string 具体错误 = $"{sht.Cells[开始行 - 2, 正在审核的列].Value.ToString()}活鸡出栏数为{rng当月出售活鸡只数.Value.ToString()}头,重量为{rng当月出售活鸡重量.Value.ToString()}公斤,平均头重为{平均头重}公斤";
                    ListSTR_核实性错误内容.Add(错误描述 + 具体错误);
                }

                #endregion
                #region  ④　若出售活鸡数量>0，出售活鸡重量/出售活鸡头数>4

                if (Convert.ToDouble(rng当月出售活鸡只数.Value) > 0 && Convert.ToDouble(rng当月出售活鸡重量.Value) / Convert.ToDouble(rng当月出售活鸡只数.Value) > 4)
                {
                    string 平均头重 = (Convert.ToDouble(rng当月出售活鸡重量.Value) / Convert.ToDouble(rng当月出售活鸡只数.Value)).ToString("F2");
                    string 错误描述 = $"[月度错误]出售活鸡出栏头重偏大,超过4公斤:";
                    string 具体错误 = $"{sht.Cells[开始行 - 2, 正在审核的列].Value.ToString()}活鸡出栏数为{rng当月出售活鸡只数.Value.ToString()}头,重量为{rng当月出售活鸡重量.Value.ToString()}公斤,平均头重为{平均头重}公斤";
                    ListSTR_核实性错误内容.Add(错误描述 + 具体错误);
                }


                #endregion
                #region ⑤　若出售家禽数量>0，出售家禽金额/出售家禽重量<9
                if (Convert.ToDouble(rng当月出售家禽只数.Value) > 0 && Convert.ToDouble(rng当月出售家禽金额.Value) / Convert.ToDouble(rng当月出售家禽重量.Value) < 9)
                {
                    string 平均单价 = (Convert.ToDouble(rng当月出售家禽金额.Value) / Convert.ToDouble(rng当月出售家禽重量.Value)).ToString("F2");
                    string 错误描述 = $"[月度错误]家禽平均单价小于9元/公斤，偏少请核实:";
                    string 具体错误 = $"{sht.Cells[开始行 - 2, 正在审核的列].Value.ToString()}家禽出售金额为{rng当月出售家禽金额.Value.ToString()}头,重量为{rng当月出售家禽重量.Value.ToString()}公斤,平均单价为{平均单价}元/公斤";
                    ListSTR_核实性错误内容.Add(错误描述 + 具体错误);
                }

                #endregion
                #region ⑥　若出售家禽数量>0，出售家禽金额/出售家禽重量>45
                if (Convert.ToDouble(rng当月出售家禽只数.Value) > 0 && Convert.ToDouble(rng当月出售家禽金额.Value) / Convert.ToDouble(rng当月出售家禽重量.Value) > 45)
                {
                    string 平均单价 = (Convert.ToDouble(rng当月出售家禽金额.Value) / Convert.ToDouble(rng当月出售家禽重量.Value)).ToString("F2");
                    string 错误描述 = $"[月度错误]家禽平均单价大于45元/公斤，偏贵请核实:";
                    string 具体错误 = $"{sht.Cells[开始行 - 2, 正在审核的列].Value.ToString()}家禽出售金额为{rng当月出售家禽金额.Value.ToString()}头,重量为{rng当月出售家禽重量.Value.ToString()}公斤,平均单价为{平均单价}元/公斤";
                    ListSTR_核实性错误内容.Add(错误描述 + 具体错误);
                }
                #endregion
                #region ⑦　若出售活鸡数量>0，出售活鸡金额/出售活鸡重量<9
                if (Convert.ToDouble(rng当月出售活鸡只数.Value) > 0 && Convert.ToDouble(rng当月出售活鸡金额.Value) / Convert.ToDouble(rng当月出售活鸡重量.Value) < 9)
                {
                    string 平均单价 = (Convert.ToDouble(rng当月出售活鸡金额.Value) / Convert.ToDouble(rng当月出售活鸡重量.Value)).ToString("F2");
                    string 错误描述 = $"[月度错误]出售活鸡平均单价小于9元/公斤，偏少请核实:";
                    string 具体错误 = $"{sht.Cells[开始行 - 2, 正在审核的列].Value.ToString()}活鸡出售金额为{rng当月出售活鸡金额.Value.ToString()}头,重量为{rng当月出售活鸡重量.Value.ToString()}公斤,平均单价为{平均单价}元/公斤";
                    ListSTR_核实性错误内容.Add(错误描述 + 具体错误);
                }

                #endregion
                #region ⑧　若出售活鸡数量>0，则出售活鸡金额/出售活鸡重量>45
                if (Convert.ToDouble(rng当月出售活鸡只数.Value) > 0 && Convert.ToDouble(rng当月出售活鸡金额.Value) / Convert.ToDouble(rng当月出售活鸡重量.Value) > 45)
                {
                    string 平均单价 = (Convert.ToDouble(rng当月出售活鸡金额.Value) / Convert.ToDouble(rng当月出售活鸡重量.Value)).ToString("F2");
                    string 错误描述 = $"[月度错误]出售活鸡平均单价大于45元/公斤，偏贵请核实:";
                    string 具体错误 = $"{sht.Cells[开始行 - 2, 正在审核的列].Value.ToString()}活鸡出售金额为{rng当月出售活鸡金额.Value.ToString()}头,重量为{rng当月出售活鸡重量.Value.ToString()}公斤,平均单价为{平均单价}元/公斤";
                    ListSTR_核实性错误内容.Add(错误描述 + 具体错误);
                }
                #endregion

            }
            //季度核实性审核
            Range rng季末存栏 = sht.Cells[开始行, 本季度数据所在列];
            Range rng季末肉用家禽存栏 = sht.Cells[开始行 + 1, 本季度数据所在列]; ;
            Range rng季末肉鸡存栏 = sht.Cells[开始行 + 2, 本季度数据所在列];
            Range rng季末蛋用家禽存栏 = sht.Cells[开始行 + 3, 本季度数据所在列];
            Range rng季末蛋鸡存栏 = sht.Cells[开始行 + 4, 本季度数据所在列];
            Range rng当季减少家禽只数 = sht.Cells[开始行 + 5, 本季度数据所在列];
            Range rng当季自宰家禽只数 = sht.Cells[开始行 + 6, 本季度数据所在列];
            Range rng当季自宰活鸡只数 = sht.Cells[开始行 + 7, 本季度数据所在列];
            Range rng当季出售家禽只数 = sht.Cells[开始行 + 8, 本季度数据所在列];
            Range rng当季出售活鸡只数 = sht.Cells[开始行 + 9, 本季度数据所在列];
            Range rng当季出售家禽金额 = sht.Cells[开始行 + 10, 本季度数据所在列];
            Range rng当季出售活鸡金额 = sht.Cells[开始行 + 11, 本季度数据所在列];
            Range rng当季出售家禽重量 = sht.Cells[开始行 + 12, 本季度数据所在列];
            Range rng当季出售活鸡重量 = sht.Cells[开始行 + 13, 本季度数据所在列];
            Range rng当季禽蛋产量 = sht.Cells[开始行 + 14, 本季度数据所在列];
            Range rng当季鸡蛋产量 = sht.Cells[开始行 + 15, 本季度数据所在列];



            
            List<string> ListSTR_季度核实性错误内容 = new List<string>();

            //接下去先审核,并把错误写到一个集合中或字典中
            #region  ①出栏头重偏小

            if (Convert.ToDouble(rng当季出售家禽只数.Value) > 0 && Convert.ToDouble(rng当季出售家禽重量.Value) / Convert.ToDouble(rng当季出售家禽只数.Value) < 1.5)
            {
                string 平均头重 = (Convert.ToDouble(rng当季出售家禽重量.Value) / Convert.ToDouble(rng当季出售家禽只数.Value)).ToString("F2");
                string 错误描述 = $"[季度错误]家禽出栏头重偏小,不足1.5公斤,小鸡小鸭若是卖掉别人继续养不算出售:";
                string 具体错误 = $"出栏数为{rng当季出售家禽只数.Value.ToString()}头,重量为{rng当季出售家禽重量.Value.ToString()}公斤,平均头重为{Convert.ToString(Math.Round((double)rng当季出售家禽重量.Value / (double)rng当季出售家禽只数.Value, 2))}公斤";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }

            #endregion
            #region  ②出栏头重过高

            if (Convert.ToDouble(rng当季出售家禽只数.Value) > 0 && Convert.ToDouble(rng当季出售家禽重量.Value) / Convert.ToDouble(rng当季出售家禽只数.Value) > 4)
            {
                string 平均头重 = (Convert.ToDouble(rng当季出售家禽重量.Value) / Convert.ToDouble(rng当季出售家禽只数.Value)).ToString("F2");
                string 错误描述 = $"[季度错误]家禽出栏头重偏大,超过4公斤:";
                string 具体错误 = $"出栏数为{rng当季出售家禽只数.Value.ToString()}头,重量为{rng当季出售家禽重量.Value.ToString()}公斤,平均头重为{平均头重}公斤";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }

            #endregion
            #region  ③　若出售活鸡数量>0，出售活鸡重量/出售活鸡头数≤1.5

            if (Convert.ToDouble(rng当季出售活鸡只数.Value) > 0 && Convert.ToDouble(rng当季出售活鸡重量.Value) / Convert.ToDouble(rng当季出售活鸡只数.Value) < 1.5)
            {
                string 平均头重 = (Convert.ToDouble(rng当季出售活鸡重量.Value) / Convert.ToDouble(rng当季出售活鸡只数.Value)).ToString("F2");
                string 错误描述 = $"[季度错误]活鸡头重应大于1.5公斤/只，小鸡若是卖掉别人继续养不算出售，偏轻请核实:";
                string 具体错误 = $"活鸡出栏数为{rng当季出售活鸡只数.Value.ToString()}头,重量为{rng当季出售活鸡重量.Value.ToString()}公斤,平均头重为{平均头重}公斤";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }

            #endregion
            #region  ④　若出售活鸡数量>0，出售活鸡重量/出售活鸡头数>4

            if (Convert.ToDouble(rng当季出售活鸡只数.Value) > 0 && Convert.ToDouble(rng当季出售活鸡重量.Value) / Convert.ToDouble(rng当季出售活鸡只数.Value) > 4)
            {
                string 平均头重 = (Convert.ToDouble(rng当季出售活鸡重量.Value) / Convert.ToDouble(rng当季出售活鸡只数.Value)).ToString("F2");
                string 错误描述 = $"[季度错误]活鸡头重大于4公斤/只，偏重请核实:";
                string 具体错误 = $"活鸡出栏数为{rng当季出售活鸡只数.Value.ToString()}头,重量为{rng当季出售活鸡重量.Value.ToString()}公斤,平均头重为{平均头重}公斤";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }


            #endregion
            #region ⑤　若出售家禽数量>0，出售家禽金额/出售家禽重量<9
            if (Convert.ToDouble(rng当季出售家禽只数.Value) > 0 && Convert.ToDouble(rng当季出售家禽金额.Value) / Convert.ToDouble(rng当季出售家禽重量.Value) < 9)
            {
                string 平均单价 = (Convert.ToDouble(rng当季出售家禽金额.Value) / Convert.ToDouble(rng当季出售家禽重量.Value)).ToString("F2");
                string 错误描述 = $"[季度错误]家禽平均单价小于9元/公斤，偏少请核实:";
                string 具体错误 = $"家禽出售金额为{rng当季出售家禽金额.Value.ToString()}头,重量为{rng当季出售家禽重量.Value.ToString()}公斤,平均单价为{平均单价}元/公斤";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }

            #endregion
            #region ⑥　若出售家禽数量>0，出售家禽金额/出售家禽重量>45
            if ((double)rng当季出售家禽只数.Value > 0 && (double)rng当季出售家禽金额.Value / (double)rng当季出售家禽重量.Value > 45)
            {
                string 平均单价 = (Convert.ToDouble(rng当季出售家禽金额.Value) / Convert.ToDouble(rng当季出售家禽重量.Value)).ToString("F2");
                string 错误描述 = $"[季度错误]家禽平均单价大于45元/公斤，偏贵请核实:";
                string 具体错误 = $"家禽出售金额为{rng当季出售家禽金额.Value.ToString()}头,重量为{rng当季出售家禽重量.Value.ToString()}公斤,平均单价为{平均单价}元/公斤";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }
            #endregion
            #region ⑦　若出售活鸡数量>0，出售活鸡金额/出售活鸡重量<9
            if (Convert.ToDouble(rng当季出售活鸡只数.Value) > 0 && Convert.ToDouble(rng当季出售活鸡金额.Value) / Convert.ToDouble(rng当季出售活鸡重量.Value) < 9)
            {
                string 平均单价 = (Convert.ToDouble(rng当季出售活鸡金额.Value) / Convert.ToDouble(rng当季出售活鸡重量.Value)).ToString("F2");
                string 错误描述 = $"[季度错误]出售活鸡平均单价小于9元/公斤，偏少请核实:";
                string 具体错误 = $"活鸡出售金额为{rng当季出售活鸡金额.Value.ToString()}头,重量为{rng当季出售活鸡重量.Value.ToString()}公斤,平均单价为{平均单价}元/公斤";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }

            #endregion
            #region ⑧　若出售活鸡数量>0，则出售活鸡金额/出售活鸡重量>45
            if (Convert.ToDouble(rng当季出售活鸡只数.Value) > 0 && Convert.ToDouble(rng当季出售活鸡金额.Value) / Convert.ToDouble(rng当季出售活鸡重量.Value) > 45)
            {
                string 平均单价 = (Convert.ToDouble(rng当季出售活鸡金额.Value) / Convert.ToDouble(rng当季出售活鸡重量.Value)).ToString("F2");
                string 错误描述 = $"[季度错误]出售活鸡平均单价大于45元/公斤，偏贵请核实:";
                string 具体错误 = $"活鸡出售金额为{rng当季出售活鸡金额.Value.ToString()}头,重量为{rng当季出售活鸡重量.Value.ToString()}公斤,平均单价为{平均单价}元/公斤";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }
            #endregion
            #region ⑨若蛋用家禽存栏数量>0，产蛋数量/蛋用家禽存栏>10。
            double 蛋禽平均产量 = Math.Round((Convert.ToDouble(rng当季禽蛋产量.Value) / Convert.ToDouble(rng季末蛋用家禽存栏.Value)), 2);
            if (Convert.ToDouble(rng季末蛋用家禽存栏.Value) > 0 && 蛋禽平均产量 > 10)
            {

                string 错误描述 = $"[季度错误]蛋禽平均产量大于10公斤，超出请核实:";
                string 具体错误 = $"季末蛋用家禽存栏为{rng季末蛋用家禽存栏.Value.ToString()}只,当季禽蛋产量为{rng当季禽蛋产量.Value.ToString()}公斤,蛋禽平均产量为{蛋禽平均产量}公斤";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }
            #endregion
            #region ⑩若蛋鸡存栏数量>0，鸡蛋产量/蛋鸡存栏>10
            double 蛋鸡平均产量 = Math.Round((Convert.ToDouble(rng当季鸡蛋产量.Value) / Convert.ToDouble(rng季末蛋鸡存栏.Value)), 2);
            if (Convert.ToDouble(rng季末蛋鸡存栏.Value) > 0 && 蛋鸡平均产量 > 10)
            {

                string 错误描述 = $"[季度错误]蛋鸡平均产量大于10公斤，超出请核实:";
                string 具体错误 = $"季末蛋鸡存栏为{rng季末蛋鸡存栏.Value.ToString()}只,当季鸡蛋产量为{rng当季鸡蛋产量.Value.ToString()}公斤,平均平均产量为{蛋鸡平均产量}公斤";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }
            #endregion
            #region 十一 若蛋鸡存栏数量>0，则鸡蛋产量=0。
            if (Convert.ToDouble(rng季末蛋鸡存栏.Value) > 0 && Convert.ToDouble(rng当季鸡蛋产量.Value) == 0)
            {
                string 错误描述 = $"[季度错误]有蛋鸡没有鸡蛋，是否漏填鸡蛋，请核实:";
                string 具体错误 = $"季末蛋鸡存栏为{rng季末蛋鸡存栏.Value.ToString()}只,当季鸡蛋产量为0";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }
            #endregion
            #region 十二 若鸡蛋产量>0，则蛋鸡存栏数量=0
            if (Convert.ToDouble(rng季末蛋鸡存栏.Value) == 0 && Convert.ToDouble(rng当季鸡蛋产量.Value) > 0)
            {
                string 错误描述 = $"[季度错误]有鸡蛋没有蛋鸡，是否漏填蛋鸡，请核实:";
                string 具体错误 = $"季末鸡蛋产量为{rng当季鸡蛋产量.Value.ToString()}只,当季蛋鸡存栏为0";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }
            #endregion
            #region 十三 若蛋禽存栏数量>0，则禽蛋产量=0。
            if (Convert.ToDouble(rng季末蛋用家禽存栏.Value) > 0 && Convert.ToDouble(rng当季禽蛋产量.Value) == 0)
            {
                string 错误描述 = $"[季度错误]有蛋禽存栏没有禽蛋产量，是否漏填禽蛋产量，请核实:";
                string 具体错误 = $"季末蛋禽存栏为{rng季末蛋用家禽存栏.Value.ToString()}只,当季禽蛋产量为0";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }
            #endregion
            #region 十四 若禽蛋产量>0，则蛋禽存栏数量=0
            if (Convert.ToDouble(rng季末蛋用家禽存栏.Value) == 0 && Convert.ToDouble(rng当季禽蛋产量.Value) > 0)
            {
                string 错误描述 = $"[季度错误]有禽蛋产量没有蛋禽存栏，是否漏填蛋禽存栏，请核实:";
                string 具体错误 = $"季末禽蛋产量为{rng当季禽蛋产量.Value.ToString()}只,当季蛋禽存栏为0";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }
            #endregion
            ListSTR_核实性错误内容.AddRange(ListSTR_季度核实性错误内容);
            base.核实数据输出至台账(ListSTR_核实性错误内容, sht);

        }
    }
}
